package com.itheima.service.impl;

import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.itheima.common.MessageConstant;
import com.itheima.common.utils.DateUtils;
import com.itheima.dao.MemberDao;
import com.itheima.dao.OrderDao;
import com.itheima.dao.OrderSettingMapper;
import com.itheima.pojo.*;
import com.itheima.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @author: yongjichu
 * @date: 2020/1/18 17:43
 * @description:
 */
@Service(interfaceClass = OrderService.class)
@Transactional
public class OrderServiceImpl implements OrderService {
    @Autowired
    OrderSettingMapper orderSettingMapper;
    @Autowired
    MemberDao memberDao;
    @Autowired
    OrderDao orderDao;
    /**
     * 订单预约
     * @param orderInfoVo
     * @return
     */
    @Override
    public Result submit(OrderInfoVo orderInfoVo) {
        /**
         * 步骤：
         * 1.根据预约的日期查看是否存在预约的设置
         * 2.如果没有预约设置提醒用户没有档期
         * 3.有预约设置的话查看是否约满（预约满就提示）
         * 4.根据手机号查看是否是我们的会员
         * 5.如果不是我们的会员就自动注册（会员id）
         * 6.根据会员id和预约日期和预约套餐查看是否是重复预约
         * 7.下单
         * 8.更新这个日期的这个套餐的已预约人数，使其加1
         * 9.返回预约成功
         *
         */
        //用户选择的日期
        Date orderDate = orderInfoVo.getOrderDate();
        //用户输入的手机号码
        String telephone = orderInfoVo.getTelephone();
        //用户的姓名
        String name = orderInfoVo.getName();
        //用户的性别
        Integer sex = orderInfoVo.getSex();
        //用户的身份证号码
        String idCard = orderInfoVo.getIdCard();
        //套餐的id
        Integer setmealId = orderInfoVo.getSetmealId();
        //预约类型
        String orderType = orderInfoVo.getOrderType();
//根据日期查询是否有设置预约
        OrderSetting orderSetting=orderSettingMapper.findbyOrderDate(orderDate);
        if(orderSetting==null){
            //说明这天没有设置预约
            return Result.error(false, MessageConstant.SELECTED_DATE_CANNOT_ORDER);
        }
        //这天设置的可以预约的人数
        int number = orderSetting.getNumber();
        //这天已经预约的人数
        int reservations = orderSetting.getReservations();
        if(number<=reservations){
            //说明已经预约满啦
            return Result.error(false,MessageConstant.ORDER_FULL);
        }
        //根据手机号码查看是否是我们的会员
        Member member = memberDao.findByTelephone(telephone);
        if(member==null){
            //说明这个用户不是我们的会员，立马注册成我们的会员（即把用户的信息存入表t_member中）
            member = new Member();
            //将用户的信息都设置到member对象中
            member.setName(name);
            member.setSex(String.valueOf(sex));
            member.setPhoneNumber(telephone);
            member.setIdCard(idCard);
            member.setRegTime(new Date());
            memberDao.add(member);
        }
        //获取主键的id
        Integer id = member.getId();
        //根据member的id和预约日期还有预约套餐的id去t_order表中查，如果查出有则说明已经预约过了，提示用户不能重复预约
        Order order = new Order();
        //将member的主键设置进去
        order.setMemberId(id);
        //将用户选择的日期设置进去
        order.setOrderDate(orderDate);
        //将用户选择的套餐的id设置进去
        order.setSetmealId(setmealId);
        //将上述的order对象当作对象传递
        List<Order> orders = orderDao.findByCondition(order);
        if(CollectionUtil.isNotEmpty(orders)){
            //说明查询的结果不为空，说明已经预约过了，提醒用户不要重复预约
            return Result.error(false,MessageConstant.HAS_ORDERED);
        }
        //下单（所谓下单就是向order表中怎加数据）
        Order order1 = new Order();
        order1.setMemberId(id);
        order1.setSetmealId(setmealId);
        order1.setOrderDate(orderDate);
        order1.setOrderType(orderType);
        order1.setOrderStatus(Order.ORDERSTATUS_NO);
        //插入数据
        orderDao.add(order1);
        //跟新已预约的人数
          //1：获取现有人数然后加1
        orderSetting.setReservations(orderSetting.getReservations()+1);
        //我们在orderSetting中增加了一个version字段
        int i=orderSettingMapper.editReservations(orderSetting);
        if(i==0){
            //抛出一个异常，让之前运行的代码回滚
            throw new RuntimeException("");
        }
        //这里一定要返回用户的用户的信息order1，因为跳转成功页面时要用，根据返回的order1查询你的预约的日期和套餐时什么
        return Result.success(true,MessageConstant.ORDER_SUCCESS,order1);
    }

    /**
     * 下单成功后，查询的数据信息
     *
     * @param id
     * @return
     */
    @Override
    public Result findByIdDetil(Integer id) throws Exception{
        Map map=orderDao.findById4Detail(id);
        if(map!=null){
            //将得到的string类型的字符串数据转换为日期格式
           Date orderDate= (Date) map.get("orderDate");
           map.put("orderDate",DateUtils.parseDate2String(orderDate));
           return Result.success(true,MessageConstant.QUERY_ORDER_SUCCESS,map);
        }
        return Result.error(false,MessageConstant.QUERY_ORDER_FAIL);
    }
}
